## Кредо разработчика

Мы придерживаемся следующих основных кредо:

| Кредо                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | Значение                                                                                                                                                                                                                                                           |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [KISS](https://ru.wikipedia.org/wiki/KISS_(%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF))<br/>«Keep it short and simple»,<br/>«Keep it simple, stupid!» и т.д.                                                                                                                                                                                                                                                                                                                        | Не усложняй код без веской причины.                                                                                                                                                                                                                                |
| [Инкапсуляция](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5))                                                                                                                                                                                                                                                           | Нам не надо знать, что там у объекта внутри, просто используем публичные методы. Так мы упрощаем для понимания сложные системы и уменьшаем связанность объектов друг с другом.                                                                                     |
| [Convention over configuration](https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B3%D0%BB%D0%B0%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B8)                                                                                                                                                                                                                                                                   | Вместо конфига, описывающего всё, лучше использовать дефолты, которые при желании можно переопределять в конфиге.                                                                                                                                                  |
| [Принцип подстановки Барбары Лисков](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%91%D0%B0%D1%80%D0%B1%D0%B0%D1%80%D1%8B_%D0%9B%D0%B8%D1%81%D0%BA%D0%BE%D0%B2)<br/>Оригинальная формулировка: "… Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T...") | Поведение класса-наследника не должно противоречить поведению, заданному классом-родителем.<br/>Чтобы можно было без проблем подставить объект класса Dog туда, где ожидается объект класса Animal.                                                                |
| [Принцип единственной ответственности](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%B5%D0%B4%D0%B8%D0%BD%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8)                                                                                                                                                                                                | Класс должен делать что-то одно.                                                                                                                                                                                                                                   |
| [Принцип разделения интерфейса](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0)<br/>"...Клиенты не должны зависеть от методов, которые они не используют..."                                                                                                                                                                    | В аргументах конструктора или метода не надо ожидать объект со множеством лишних деталей, если классу для работы нужен лишь маленький специфический объектик или вообще тупо один integer. <br/>И точно не надо пихать во все классы контейнер зависимостей.       |
| [High Cohesion](https://thebojan.ninja/2015/04/08/high-cohesion-loose-coupling/)                                                                                                                                                                                                                                                                                                                                                                                                    | Класс должен делать что-то одно :). Если вы видите, что некоторые методы используются обособленно, отдельно от других, с какими-то своими данными, значит у вас не high cohesion. Возможно стоит разделить класс на части или перенести часть методов куда-то еще. |
| [Low coupling](https://thebojan.ninja/2015/04/08/high-cohesion-loose-coupling/)                                                                                                                                                                                                                                                                                                                                                                                                     | Классы должны быть как можно меньше завязаны на другие классы, особенно на их содержимое. Не управляйте лапами собаки, управляйте собакой.                                                                                                                         |
| [Принцип инверсии зависимостей](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%B8%D0%BD%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9)<br/>"… Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций..."                                  | Классы должны быть как можно меньше завязаны на другие классы :)<br/>Для гибкости кода в аргументах конструктора/метода нужно делать интерфейсы или абстрактные классы, а не конкретные классы.                                                                    |
| [Принцип открытости/закрытости](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%BE%D1%81%D1%82%D0%B8/%D0%B7%D0%B0%D0%BA%D1%80%D1%8B%D1%82%D0%BE%D1%81%D1%82%D0%B8)<br/>"… Программные сущности (классы, модули, функции и т. п.) должны быть открыты для расширения, но закрыты для изменения..."                                                                                                                  | Новая функциональность должна добавляться путём добавления нового класса, а не добавлением новой ветки if в существующий класс, который делает всё на свете.                                                                                                       |
| [YAGNI](https://ru.wikipedia.org/wiki/YAGNI)<br/>«You aren't gonna need it», «Вам это не понадобится»                                                                                                                                                                                                                                                                                                                                                                               | Не надо делать того, что не просили. Подход «возможно в будущем понадобится» сильно усложняет код и поддержку.                                                                                                                                                     |
